<template>
	<scroll-view style="flex: 1;">
		<view class="fy-head-flex">
			<text class="fy-head-text">传统蓝牙</text>
			<button @click="setPermiss">获取设备权限</button>
			<button @click="getPermiss">获取当前是否授权</button>
			<button @click="getState">获取蓝牙是否打开</button>
			<button @click="open">打开蓝牙</button>
			<button @click="close">关闭蓝牙</button>
			<button @click="getBlue">获取附近蓝牙设备</button>
			<button @click="setStop">停止扫描附近蓝牙设备</button>
			<button @click="openBlue">打开蓝牙列表</button>
			<button @click="offDevice">将已经连接并且订阅的取消订阅</button>
			<button @click="getDevices">获取已配对设备信息</button>
			<button @click="onProfile">订阅A2DP/HFP/HID</button>
			<button @click="offProfile">取消订阅A2DP/HFP/HID</button>
			<button @click="setUUID">随机生成UUID</button>
		</view>
		<view class="fy-head-flex">
			<text class="fy-head-text">低功耗蓝牙</text>
			低功耗过于复杂用另外用一个插件写
		</view>
	</scroll-view>
	<!-- 组件 -->
	<view v-show="isOpen" class="fy-popup-back" @click="isOpen = false"></view>
	<view class="fy-popup-view" v-show="isOpen">
		<scroll-view class="fy-scroll-view">
			<view class="fy-bule-list">
				<view class="fy-bile-item" v-for="item in blueList">
					<view class="fy-bult-code">
						<text>设备名称:{{ item.deviceName }}</text>
						<text>设备编码: {{ item.deviceId }}</text>
					</view>
					<view @click="setDevice(item)">
						<text class="fy-blue-pair">连接</text>
					</view>
				</view>
				<view style="height: 300rpx;"></view>
			</view>
		</scroll-view>
	</view>
</template>

<script setup lang="ts">
	import { reactive, computed, onMounted, ref, nextTick, getCurrentInstance } from 'vue'
	import { onLoad, onShow } from '@dcloudio/uni-app'
	import {
		getBluetooth,
		getPermissUser,
		getBluetoothState,
		openBluetooth,
		setPermissUser,
		closeBluetooth,
		setBluetoothStop,
		setPairDevice,
		offPairDevice,
		getPairedDevices,
		onBluetoothA2DP,
		onBluetoothHFP,
		onBluetoothHID,
		setConnectAllowedProfiles,
		offBluetoothA2DP,
		offBluetoothHFP,
		offBluetoothHID,
		getEnerateRandomUUID,
		onStartListen,
	} from '@/uni_modules/an-bluetooth'

	const blueList = ref<any>([{}]); // 蓝牙列表
	const isOpen = ref<boolean>(false); // 打开蓝牙列表
	// 获取蓝牙权限
	const setPermiss = async () => {
		let number = await setPermissUser();
		// number.authResults: [0],
		// 0表示已经授权 -1表示没有授权
		console.log(number);
	}
	// 检查当前是否授权
	const getPermiss = async () => {
		let number = await getPermissUser();
		console.log(number);
	}
	// 获取蓝牙是否打开
	const getState = () => {
		// 0 是关闭 2是打开
		let state = getBluetoothState();
		console.log(state);
	}
	// 打开蓝牙
	const open = () => {
		openBluetooth()
	}
	// 关闭蓝牙
	const close = () => {
		closeBluetooth()
	}
	// 扫描周围的蓝牙
	const getBlue = () => {
		getBluetooth({
			count: 12,
			onResult: (res) => {
				console.log(res);
			},
			offResult: (res) => {
				console.log(res.length);
				blueList.value = res;
			}
		})
	}
	// 停止扫描
	const setStop = () => {
		let list = setBluetoothStop();
		blueList.value = list;
	}
	// 打开蓝牙列表
	const openBlue = () => {
		if (blueList.value.length <= 0) {
			uni.showToast({
				title: '没有数据，先扫描看看'
			})
			return;
		}
		isOpen.value = true;
	}
	// 连接
	const setDevice = (item : any) => {
		setPairDevice({
			device: item.deviceId,
			success: () => {
				console.log('32312321');
			},
			onResult: (res) => {
				console.log(res);
			}
		})
	}
	// 将已经连接并且订阅的取消订阅
	const offDevice = () => {
		offPairDevice();
	}
	// 获取已配对设备信息
	const getDevices = () => {
		let list = getPairedDevices({});
		console.log(list);
	}

	// 订阅A2DP/HFP/HID
	// 先 打开蓝牙列表 连接设备在 订阅
	const onProfile = () => {
		let list = getPairedDevices({});
		console.log(list);
		if (list.length <= 0) return;
		// https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/bluetooth-overview-V13
		// a2dp模块（高级音频分发配置文件）：A2DP是Advanced Audio Distribution Profile的缩写，即高级音频分发配置文件。它是一种蓝牙协议，允许无线传输高品质音频流，例如音乐或语音通话，同时支持双向通信，因此可以用于耳机、扬声器、汽车音响等设备。
		// ble模块（低功耗蓝牙）：BLE是Bluetooth Low Energy的缩写，意为“低功耗蓝牙”。它是一种能够在低功耗情况下进行通信的蓝牙技术，与传统蓝牙相比，BLE的功耗更低，适用于需要长时间运行的低功耗设备，如智能手表、健康监测设备、智能家居等。
		// hfp模块（免提模式）：HFP模块是指蓝牙耳机或车载蓝牙设备中的Hands-Free Profile，即“免提模式”。HFP允许用户通过蓝牙连接手机或其他蓝牙设备，实现免提通话和语音控制等功能。
		// hid模块（人机接口设备）：HID是Human Interface Device的缩写，即人机接口设备。在蓝牙中，HID模块是一种允许用户通过蓝牙连接键盘、鼠标、游戏手柄等人机接口设备的模块。用户可以通过HID模块将这些设备连接到蓝牙主机上，实现无线控制和输入。

		// 创建A2DP订阅
		// 连接之前最好使用 onBluetoothA2DP，并且在success里面
		// 因为有可能设备不支持A2DP、HFP、HID，直接连接可能会报错
		// 三个订阅方式最好连接一次，连接多次可能报错

		let deviceId = list[0].deviceId;

		// onBluetoothA2DP({
		//  device: deviceId,
		//  success: () => {
		//      console.log('订阅成功');
		//      // 连接
		//      setConnectAllowedProfiles({
		//          device: deviceId,
		//          success: () => {
		//              console.log('连接成功');
		//          },
		//          fail: (err) => {
		//              console.log('连接失败',err);
		//          }
		//      })
		//  },
		//  fail: (err) => {
		//      console.log('订阅失败',err);
		//  }
		// })
		onBluetoothHFP({
			device: deviceId,
			onResult: (res) => {
				console.log(res);
			},
			success: () => {
				console.log('订阅成功');
				// 连接
				setConnectAllowedProfiles({
					device: deviceId,
					success: () => {
						console.log('连接成功');
					},
					fail: (err) => {
						console.log('连接失败', err);
					}
				})
			},
			fail: (err) => {
				console.log('订阅失败', err);
			}
		})
		// onBluetoothHID({
		//  device: deviceId,
		//  success: () => {
		//      console.log('订阅成功');
		//      // 连接
		//      setConnectAllowedProfiles({
		//          device: deviceId,
		//          success: () => {
		//              console.log('连接成功');
		//          },
		//          fail: (err) => {
		//              console.log('连接失败',err);
		//          }
		//      })
		//  },
		//  fail: (err) => {
		//      console.log('订阅失败',err);
		//  }
		// })
	}
	// 取消订阅A2DP/HFP/HID
	const offProfile = () => {
		try {
			// 取消A2DP订阅
			offBluetoothA2DP();
			// 取消HFP订阅
			offBluetoothHFP();
			// 取消HID订阅
			offBluetoothHID();
		} catch (err) {

		}
	}
	// 随机生成UUID
	const setUUID = () => {
		let uuid = getEnerateRandomUUID();
		console.log(uuid);
	}
</script>

<style lang="scss">
	.fy-popup-back {
		position: absolute;
		top: 0;
		width: 100%;
		height: 100%;
		z-index: 90;
		background-color: #00000038;
	}

	.fy-popup-view {
		position: absolute;
		bottom: 0;
		width: 100%;
		z-index: 100;
	}

	.fy-scroll-view {
		height: 1000rpx;
		background-color: #fff;
		border-radius: 10px 10px 0 0;
		padding: 20px 10px;
	}

	.fy-bile-item {
		padding: 10px 0;
		border-bottom: 1px solid #000;
		flex-direction: row;
		justify-content: space-between;
		align-items: center;
	}

	.fy-blue-pair {
		text-align: center;
		width: 150rpx;
		padding: 5px 10px;
		background-color: #008AFF;
		color: #fff;
		border-radius: 5px;
	}

	.fy-bult-code {
		width: 70%;
	}

	.fy-head-flex {
		border: 1px solid #555;
		border-radius: 5px;
		padding: 10px;
		margin: 10px;
	}

	.fy-head-text {
		color: #008AFF;
		font-size: 20px;
		font-weight: bold;
		margin-bottom: 10px;
	}
</style>